package language.basic.oopBase;

//super 关键字有两个用途：
// 一是调用超类的方法、属性  super.method(),super.attribute  super只是一个指示编译器调用超类方法或属性的特殊关键字
// 二是调用超类的构造器。   super(), super(xx,xx,xx)
class Animal {
    public String animal;
    Animal() {
        System.out.println("An Animal");
    }

    public Animal(String animal){
        this.animal=animal;
        System.out.println(animal);
    }
    public void hello(){
        System.out.println("我被子类用super调用了方法");
    }
}

class Dog extends Animal {
    Dog() {
        super(); //如果子类构造函数中没有写super()函数，编译器会自动帮我们添加一个无参数的super()
        //super();错误的，因为super()方法必须在构造函数的第一行
    }
    public void invokeParentAttribute(){
        System.out.println("dog用super.animal调用父类public属性:" + super.animal);
    }
}

class Cat extends Animal {
    Cat() {
        super("cat 初始化");
        System.out.println("创建了一个cat");
        //super();错误的，因为super()方法必须在构造函数的第一行
        //如果子类构造函数中没有写super()函数，编译器会自动帮我们添加一个无参数的super()
    }
    public void invokeParentAttribute(){
        System.out.println("Cat用super.animal调用父类public属性:" + super.animal);
    }
    public void hello(){
        super.hello();//调用父类方法
    }
}

public class superTest {
    public static void main(String [] args){
        Dog dog = new Dog();
        Cat cat = new Cat();
        cat.invokeParentAttribute();
        dog.invokeParentAttribute(); //dot和cat的父类是分开的
        cat.hello();
    }

}
